package cn.stylefeng.guns.sys.modular.user.controller;

import cn.hutool.core.util.ObjectUtil;
import cn.hutool.core.util.StrUtil;
import cn.stylefeng.guns.core.annotion.BusinessLog;
import cn.stylefeng.guns.core.annotion.DataScope;
import cn.stylefeng.guns.core.annotion.Permission;
import cn.stylefeng.guns.core.consts.CommonConstant;
import cn.stylefeng.guns.core.enums.LogAnnotionOpTypeEnum;
import cn.stylefeng.guns.core.pojo.response.ResponseData;
import cn.stylefeng.guns.core.pojo.response.SuccessResponseData;
import cn.stylefeng.guns.core.util.HttpServletUtil;
import cn.stylefeng.guns.core.util.IpAddressUtil;
import cn.stylefeng.guns.sys.core.cache.RedisCache;
import cn.stylefeng.guns.sys.modular.user.param.SysUserParam;
import cn.stylefeng.guns.sys.modular.user.service.SysUserService;
import io.swagger.annotations.ApiOperation;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;
import jakarta.annotation.Resource;
import jakarta.servlet.http.HttpServletRequest;

/**
 * 系统用户控制器
 *
 * @author xuyuxiang
 * @date 2020/3/19 21:14
 */
@RestController
public class SysUserController {

    @Resource
    private SysUserService sysUserService;

    @Autowired
    private RedisCache redisCache;

    /**
     * 查询系统用户
     *
     * @author xuyuxiang
     * @date 2020/3/20 21:00
     */
    @Permission
    @DataScope
    @GetMapping("/sysUser/page")
    @BusinessLog(title = "系统用户_查询", opType = LogAnnotionOpTypeEnum.QUERY)
    public ResponseData page(SysUserParam sysUserParam) {
        return new SuccessResponseData(sysUserService.page(sysUserParam));
    }

    /**
     * 增加系统用户
     *
     * @author xuyuxiang
     * @date 2020/3/23 16:28
     */
    @Permission
    @DataScope
    @PostMapping("/sysUser/add")
    @BusinessLog(title = "系统用户_增加", opType = LogAnnotionOpTypeEnum.ADD)
    public ResponseData add(@RequestBody @Validated(SysUserParam.add.class) SysUserParam sysUserParam) {
        sysUserService.add(sysUserParam);
        return new SuccessResponseData();
    }

    /**
     * 删除系统用户
     *
     * @author xuyuxiang
     * @date 2020/3/23 16:28
     */
    @Permission
    @DataScope
    @PostMapping("/sysUser/delete")
    @BusinessLog(title = "系统用户_删除", opType = LogAnnotionOpTypeEnum.DELETE)
    public ResponseData delete(@RequestBody @Validated(SysUserParam.delete.class) SysUserParam sysUserParam) {
        sysUserService.delete(sysUserParam);
        return new SuccessResponseData();
    }

    /**
     * 编辑系统用户
     *
     * @author xuyuxiang
     * @date 2020/3/23 16:28
     */
    @Permission
    @DataScope
    @PostMapping("/sysUser/edit")
    @BusinessLog(title = "系统用户_编辑", opType = LogAnnotionOpTypeEnum.EDIT)
    public ResponseData edit(@RequestBody @Validated(SysUserParam.edit.class) SysUserParam sysUserParam) {
        sysUserService.edit(sysUserParam);
        return new SuccessResponseData();
    }

    /**
     * 查看系统用户
     *
     * @author xuyuxiang
     * @date 2020/3/23 16:28
     */
    @Permission
    @GetMapping("/sysUser/detail")
    @BusinessLog(title = "系统用户_查看", opType = LogAnnotionOpTypeEnum.DETAIL)
    public ResponseData detail(@Validated(SysUserParam.detail.class) SysUserParam sysUserParam) {
        return new SuccessResponseData(sysUserService.detail(sysUserParam));
    }

    /**
     * 修改状态
     *
     * @author xuyuxiang
     * @date 2020/5/25 14:32
     */
    @Permission
    @PostMapping("/sysUser/changeStatus")
    @BusinessLog(title = "系统用户_修改状态", opType = LogAnnotionOpTypeEnum.CHANGE_STATUS)
    public ResponseData changeStatus(@RequestBody @Validated(SysUserParam.changeStatus.class) SysUserParam sysUserParam) {
        sysUserService.changeStatus(sysUserParam);
        return new SuccessResponseData();
    }

    /**
     * 授权角色
     *
     * @author xuyuxiang
     * @date 2020/3/28 16:05
     */
    @Permission
    @DataScope
    @PostMapping("/sysUser/grantRole")
    @BusinessLog(title = "系统用户_授权角色", opType = LogAnnotionOpTypeEnum.GRANT)
    public ResponseData grantRole(@RequestBody @Validated(SysUserParam.grantRole.class) SysUserParam sysUserParam) {
        sysUserService.grantRole(sysUserParam);
        return new SuccessResponseData();
    }

    /**
     * 授权设备信息
     *
     * @author zhanggq
     * @date 2024/7/30 16:05
     */
//    @Permission
    @GetMapping("/sysUser/permitDeviceDetail")
    @BusinessLog(title = "系统用户_授权设备信息详情", opType = LogAnnotionOpTypeEnum.DETAIL)
    public ResponseData permitDeviceDetail(SysUserParam sysUserParam) {
        return new SuccessResponseData(sysUserService.permitDeviceDetail(sysUserParam));
    }

    /**
     * 授权设备
     *
     * @author zhanggq
     * @date 2024/7/30 16:05
     */
//    @Permission
    @DataScope
    @PostMapping("/sysUser/grantPermitDevice")
    @BusinessLog(title = "系统用户_授权设备", opType = LogAnnotionOpTypeEnum.GRANT)
    public ResponseData grantPermitDevice(@RequestBody SysUserParam sysUserParam) {
        sysUserService.grantPermitDevice(sysUserParam);
        return new SuccessResponseData();
    }

    /**
     * 授权数据
     *
     * @author xuyuxiang
     * @date 2020/3/28 16:05
     */
    @Permission
    @DataScope
    @PostMapping("/sysUser/grantData")
    @BusinessLog(title = "系统用户_授权数据", opType = LogAnnotionOpTypeEnum.GRANT)
    public ResponseData grantData(@RequestBody @Validated(SysUserParam.grantData.class) SysUserParam sysUserParam) {
        sysUserService.grantData(sysUserParam);
        return new SuccessResponseData();
    }

    /**
     * 更新信息
     *
     * @author xuyuxiang
     * @date 2020/4/1 14:27
     */
    @PostMapping("/sysUser/updateInfo")
    @BusinessLog(title = "系统用户_更新信息", opType = LogAnnotionOpTypeEnum.UPDATE)
    public ResponseData updateInfo(@RequestBody @Validated(SysUserParam.updateInfo.class) SysUserParam sysUserParam) {
        sysUserService.updateInfo(sysUserParam);
        return new SuccessResponseData();
    }

    /**
     * 修改密码
     *
     * @author xuyuxiang
     * @date 2020/4/1 14:42
     */
    @PostMapping("/sysUser/updatePwd")
    @BusinessLog(title = "系统用户_修改密码", opType = LogAnnotionOpTypeEnum.UPDATE)
    public ResponseData updatePwd(@RequestBody @Validated(SysUserParam.updatePwd.class) SysUserParam sysUserParam) {
        sysUserService.updatePwd(sysUserParam);
        return new SuccessResponseData();
    }

    @GetMapping("/sysUser/getVerifyCode")
    @BusinessLog(title = "系统用户_获取验证码", opType = LogAnnotionOpTypeEnum.QUERY)
    public ResponseData getVerifyCode(@RequestParam("account") String account, @RequestParam("locale") String locale) {
        return sysUserService.getVerifyCode(account, locale);
    }

    /**
     * 忘记密码并修改密码
     *
     * @author kongtao
     * @date 2024/2/28 9:14
     */

    @ApiOperation(value = "系统用户_忘记密码并修改密码", notes = "系统用户_忘记密码并修改密码")
    @PostMapping("/sysUser/modifyPwd")
    @ResponseBody
    public ResponseData modifyPwd(@RequestBody SysUserParam sysUserParam) {
        return sysUserService.modifyPwd(sysUserParam);
    }

    /**
     * 拥有角色
     *
     * @author xuyuxiang
     * @date 2020/3/28 14:46
     */
    @Permission
    @GetMapping("/sysUser/ownRole")
    @BusinessLog(title = "系统用户_拥有角色", opType = LogAnnotionOpTypeEnum.DETAIL)
    public ResponseData ownRole(@Validated(SysUserParam.detail.class) SysUserParam sysUserParam) {
        return new SuccessResponseData(sysUserService.ownRole(sysUserParam));
    }

    /**
     * 拥有数据
     *
     * @author xuyuxiang
     * @date 2020/3/28 14:46
     */
    @Permission
    @GetMapping("/sysUser/ownData")
    @BusinessLog(title = "系统用户_拥有数据", opType = LogAnnotionOpTypeEnum.DETAIL)
    public ResponseData ownData(@Validated(SysUserParam.detail.class) SysUserParam sysUserParam) {
        return new SuccessResponseData(sysUserService.ownData(sysUserParam));
    }

    /**
     * 重置密码
     *
     * @author xuyuxiang
     * @date 2020/4/1 14:42
     */
    @Permission
    @PostMapping("/sysUser/resetPwd")
    @BusinessLog(title = "系统用户_重置密码", opType = LogAnnotionOpTypeEnum.UPDATE)
    public ResponseData resetPwd(@RequestBody @Validated(SysUserParam.resetPwd.class) SysUserParam sysUserParam, HttpServletRequest request) {
        // 验证当前用户密码
        sysUserService.checkUserPwd(sysUserParam);

        // 需要重置的用户id
        String id = request.getParameter("id");
        SysUserParam resetSysUserParam = new SysUserParam();
        resetSysUserParam.setId(Long.valueOf(id));
        sysUserService.resetPwd(resetSysUserParam);
        return new SuccessResponseData();
    }

    /**
     * 修改头像
     *
     * @author xuyuxiang
     * @date 2020/6/28 15:19
     */
    @PostMapping("/sysUser/updateAvatar")
    @BusinessLog(title = "系统用户_修改头像", opType = LogAnnotionOpTypeEnum.UPDATE)
    public ResponseData updateAvatar(@RequestBody @Validated(SysUserParam.updateAvatar.class) SysUserParam sysUserParam) {
        sysUserService.updateAvatar(sysUserParam);
        return new SuccessResponseData();
    }

    /**
     * 导出系统用户
     *
     * @author xuyuxiang
     * @date 2020/6/30 16:07
     */
    @Permission
    @GetMapping("/sysUser/export")
    @BusinessLog(title = "系统用户_导出", opType = LogAnnotionOpTypeEnum.EXPORT)
    public void export(SysUserParam sysUserParam) {
        sysUserService.export(sysUserParam);
    }


    /**
     * 用户选择器
     *
     * @author xuyuxiang
     * @date 2020/7/3 13:17
     */
    @Permission
    @GetMapping("/sysUser/selector")
    @BusinessLog(title = "系统用户_选择器", opType = LogAnnotionOpTypeEnum.QUERY)
    public ResponseData selector(SysUserParam sysUserParam) {
        return new SuccessResponseData(sysUserService.selector(sysUserParam));
    }

    /**
     * 检查用户上次修改密码时间在规定范围内
     *
     * @author zhanggq
     * @date 2022/12/15 13:17
     */
    @GetMapping("/sysUser/isOverUpdatePwdTimeScope")
    @BusinessLog(title = "检查用户上次修改密码时间超期", opType = LogAnnotionOpTypeEnum.QUERY)
    public ResponseData isOverUpdatePwdTimeScope(SysUserParam sysUserParam) {
        return sysUserService.isOverUpdatePwdTimeScope(sysUserParam);
    }


    /**
     * sso增加系统用户
     *
     * @author xuyuxiang
     * @date 2020/3/23 16:28
     */
    @DataScope
    @PostMapping("/sysUser/sso/add")
    @BusinessLog(title = "SSO系统用户_增加", opType = LogAnnotionOpTypeEnum.ADD)
    public ResponseData ssoAdd(@RequestBody SysUserParam sysUserParam) {
        sysUserService.ssoAdd(sysUserParam);
        return new SuccessResponseData();
    }


    /**
     * sso修改系统用户
     *
     * @author xuyuxiang
     * @date 2020/3/23 16:28
     */
    @DataScope
    @PostMapping("/sysUser/sso/update")
    @BusinessLog(title = "SSO系统用户_修改", opType = LogAnnotionOpTypeEnum.ADD)
    public ResponseData ssoUpdate(@RequestBody SysUserParam sysUserParam) {
        sysUserService.ssoUpdate(sysUserParam);
        return new SuccessResponseData();
    }


    /**
     * SSO删除系统用户
     *
     * @author xuyuxiang
     * @date 2020/3/23 16:28
     */
    @DataScope
    @PostMapping("/sysUser/sso/delete")
    @BusinessLog(title = "SSO系统用户_删除", opType = LogAnnotionOpTypeEnum.DELETE)
    public ResponseData ssoDelete(@RequestBody @Validated(SysUserParam.delete.class) SysUserParam sysUserParam) {
        sysUserService.ssoDelete(sysUserParam);
        return new SuccessResponseData();
    }
}
